﻿using System;
using System.Collections.Generic;
using NHibernate.Criterion;
using EntitiesAndMappings.Entities;
using NHibernate.SqlCommand;
using NHibernate;
using ProyectoActivos.Dtos;

namespace ProyectoActivos.Daos
{
    public class EntregaEquipoDAO : BaseDAO<EntregaEquipo>
    {
        public IList<EntregaEquipo> Consultar(ConsultaEntregaEquipoParams consultaEntregaEquipoParams)
        {
            IList<EntregaEquipo> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<EntregaEquipo>();

                    criteria.CreateCriteria("DetalleSalida", "DetalleSalida", JoinType.InnerJoin)
                        .CreateAlias("Articulo", "Articulo", JoinType.InnerJoin)
                        .CreateCriteria("Salida", "Salida", JoinType.InnerJoin)
                        .CreateAlias("Proyecto", "Proyecto", JoinType.InnerJoin)
                        .CreateAlias("Lote", "Lote", JoinType.InnerJoin)
                        .CreateAlias("Lugar", "Lugar", JoinType.InnerJoin);
                        

                    criteria.CreateAlias("Trabajador", "Trabajador", JoinType.InnerJoin);


                    if (!String.IsNullOrEmpty(consultaEntregaEquipoParams.Apellidos))
                    {

                        criteria.Add(Restrictions.Like("Trabajador.Apellidos", consultaEntregaEquipoParams.Apellidos + "%"));
                    }

                    if (!String.IsNullOrEmpty(consultaEntregaEquipoParams.Nombres))
                    {

                        criteria.Add(Restrictions.Like("Trabajador.Nombres", consultaEntregaEquipoParams.Nombres + "%"));
                    }

                    if (consultaEntregaEquipoParams.IdArticulo != 0)
                    {
                        criteria.Add(Restrictions.Eq("DetalleSalida.Articulo.Id", consultaEntregaEquipoParams.IdArticulo));
                    }

                    if (consultaEntregaEquipoParams.IdProyecto != 0)
                    {
                        criteria.Add(Restrictions.Eq("Salida.Proyecto.Id", consultaEntregaEquipoParams.IdProyecto));
                    }

                    if (consultaEntregaEquipoParams.IdLote != 0)
                    {
                        criteria.Add(Restrictions.Eq("Salida.Lote.Id", consultaEntregaEquipoParams.IdLote));
                    }

                    if (consultaEntregaEquipoParams.IdLugar != 0)
                    {
                        criteria.Add(Restrictions.Eq("Salida.Lugar.Id", consultaEntregaEquipoParams.IdLugar));
                    }

                    criteria.Add(Restrictions.Between("Salida.Fecha", consultaEntregaEquipoParams.FechaDesde, consultaEntregaEquipoParams.FechaHasta));

                    lista = criteria.List<EntregaEquipo>();
                    transaction.Commit();
                }

            }
            return lista;
        }
    }
}
